#include <assertor/assertor.h>
#include <cstdlib>
#include <iostream>
#include <string>

using namespace kp::Assertor;

int
main()
{
    // 1) 从环境变量初始化（若设置了 ASSERTOR_POLICY / ASSERTOR_LOG_FILE 等）
    init_from_environment();

    // 2) 默认上下文配置：策略为仅记录日志、启用日志、设置时区与线程ID显示
    set_default_policy(FailurePolicy::LogOnly);
    set_logging_enabled(true);
    set_log_timezone(8); // 中国时区示例
    set_log_thread_id_enabled(true);

    // 将日志镜像到 stderr，便于直接观察
    attach_log_sink([](const std::string & line) { std::cerr << "[mirror] " << line << '\n'; });

    // 若环境未指定日志文件，则使用本地文件
    const char * env_log = std::getenv("ASSERTOR_LOG_FILE");
    if (!env_log || std::string(env_log).empty())
    {
        set_log_file("context_showcase.log", /*append=*/true);
    }

    // 3) 生成若干失败示例，观察日志输出
    ASSERT_ENSURE(false, PolicyViolation, std::string{"demo: forced violation"});
    ASSERT_ENV_EXISTS("THIS_ENV_SHOULD_NOT_EXIST");
    ASSERT_FILE_EXISTS(false, "this_file_should_not_exist.txt");

    // 4) 自定义 AssertorContext，独立日志文件与配置
    AssertorContext custom_ctx{};
    set_context(&custom_ctx); // 切换到自定义上下文（懒初始化其 log_stream）
    set_default_policy(FailurePolicy::LogOnly);
    set_logging_enabled(true);
    set_log_timezone(0); // 切换到 UTC
    set_log_thread_id_enabled(false);
    set_log_file("context_custom.log", /*append=*/true);

    // 在自定义上下文下再生成一条日志
    ASSERT_ENSURE(false, ConfigValidationFailed, std::string{"key"}, std::string{"invalid"});

    // 恢复默认上下文
    set_context(nullptr);

    std::cout << "AssertorContext showcase completed." << std::endl;
    return 0;
}